package br.siagefi.model;


import br.siagefi.interfaces.BaseEntity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;


@Entity
@Table(name = "documento")
@NamedQueries({
@NamedQuery(name = "Documento.buscaPorPessoa", query = "SELECT d FROM Documento d WHERE d.pessoa = ?1"),
@NamedQuery(name = "Documento.buscaGrupoLancamento", query = "SELECT d FROM Documento d WHERE d.grupoLancamento = ?1"),
@NamedQuery(name = "Documento.buscaTipoDocumento", query = "SELECT d FROM Documento d WHERE d.tipoDocumento = ?1")})
public class Documento implements Serializable, BaseEntity {
 
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
        
    @ManyToOne
    private ContaBancaria conta;
    
    @ManyToOne
    private TipoDocumento tipoDocumento;
    
    @ManyToOne
    private GrupoLancamento grupoLancamento;
    
    @OneToOne
    private Pessoa pessoa;
	 
    @Column(name = "origem", length = 20)
    private String origem;
           
    @Column(name = "tipoCusto", length = 20)
    private String tipoCusto;
	 
    @Column(name = "natureza", length = 10)
    private String natureza;
	 
    @Column(name = "forma_pagamento", length = 10)
    private String formaPagamento;
	 
    @Column(name = "periodicidade", length = 12)
    private String periodicidade;
	 
    @Column(name = "nr_documento")
    private int nrDocumento;
	 
    @Column
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataEmissao;
	 
    @Column(name = "valor")
    private double valor;
	 
    @Column(name = "descricao", length = 250)
    private String descricao;
	 
    @Column(name = "situacao", length = 12)
    private String situacao;
	 
    @Column(name = "valor_entrada")
    private double valorEntrada;
	 
    @Column(name = "qtde_parcelas")
    private int qtdeParcelas;
	 
    @Column
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataPrimeiraParcela;
	 
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE, mappedBy = "documento")
    private List<Lancamento> lancamentos;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE, mappedBy = "documento")
    private NotaFiscal notaFiscal;
    
    public Documento() {
        this.lancamentos = new ArrayList<>();
    }
    
    @Override
    public Long getId() {
        return id;
    }

    public ContaBancaria getConta() {
        return conta;
    }

    public void setConta(ContaBancaria conta) {
        this.conta = conta;
    }

    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }
    
    public String getOrigem() {
        return origem;
    }

    public void setOrigem(String origem) {
        this.origem = origem;
    }
    
    public GrupoLancamento getGrupoLancamento() {
        return grupoLancamento;
    }

    public void setGrupoLancamento(GrupoLancamento grupoLancamento) {
        this.grupoLancamento = grupoLancamento;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public String getTipoCusto() {
        return tipoCusto;
    }

    public void setTipoCusto(String tipoCusto) {
        this.tipoCusto = tipoCusto;
    }

    public String getNatureza() {
        return natureza;
    }

    public void setNatureza(String natureza) {
        this.natureza = natureza;
    }

    public String getFormaPagamento() {
        return formaPagamento;
    }

    public void setFormaPagamento(String formaPagamento) {
        this.formaPagamento = formaPagamento;
    }

    public String getPeriodicidade() {
        return periodicidade;
    }

    public void setPeriodicidade(String periodicidade) {
        this.periodicidade = periodicidade;
    }

    public int getNrDocumento() {
        return nrDocumento;
    }

    public void setNrDocumento(int nrDocumento) {
        this.nrDocumento = nrDocumento;
    }

    public Date getDataEmissao() {
        return dataEmissao;
    }

    public void setDataEmissao(Date dataEmissao) {
        this.dataEmissao = dataEmissao;
    }


    public double getValor() {
        return valor;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getSituacao() {
        return situacao;
    }

    public void setSituacao(String situacao) {
        this.situacao = situacao;
    }

    public double getValorEntrada() {
        return valorEntrada;
    }

    public void setValorEntrada(double valorEntrada) {
        this.valorEntrada = valorEntrada;
    }

    public int getQtdeParcelas() {
        return qtdeParcelas;
    }

    public void setQtdeParcelas(int qtdeParcelas) {
        this.qtdeParcelas = qtdeParcelas;
    }


    public Date getDataPrimeiraParcela() {
        return dataPrimeiraParcela;
    }

    public void setDataPrimeiraParcela(Date dataPrimeiraParcela) {
        this.dataPrimeiraParcela = dataPrimeiraParcela;
    }

    public List<Lancamento> getLancamentos() {
        return lancamentos;
    }

    public void setLancamentos(List<Lancamento> lancamentos) {
        this.lancamentos = lancamentos;
    }

    public NotaFiscal getNotaFiscal() {
        return notaFiscal;
    }

    public void setNotaFiscal(NotaFiscal notaFiscal) {
        this.notaFiscal = notaFiscal;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 59 * hash + Objects.hashCode(this.tipoDocumento);
        hash = 59 * hash + Objects.hashCode(this.natureza);
        hash = 59 * hash + this.nrDocumento;
        hash = 59 * hash + Objects.hashCode(this.dataEmissao);
        hash = 59 * hash + (int) (Double.doubleToLongBits(this.valor) ^ (Double.doubleToLongBits(this.valor) >>> 32));
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Documento other = (Documento) obj;
        if (!Objects.equals(this.tipoDocumento, other.tipoDocumento)) {
            return false;
        }
        if (!Objects.equals(this.natureza, other.natureza)) {
            return false;
        }
        if (this.nrDocumento != other.nrDocumento) {
            return false;
        }
        if (!Objects.equals(this.dataEmissao, other.dataEmissao)) {
            return false;
        }
        if (Double.doubleToLongBits(this.valor) != Double.doubleToLongBits(other.valor)) {
            return false;
        }
        return true;
    }
    

	 
	 
}
